<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Acl {
    /* VARS */

    private $_CI = null;
    private $_groups = array();
    private $_module = null;
    private $_rights = array();
    private $_user = null;

    /* PUBLIC METHODS */

    /**
     * Constructeur de la class ACL.
     */
    public function __construct() {
        $this->_CI = get_instance();
    }

    /**
     * Permet de vérifier le droit du module chargé.
     * Si $user n'est pas définie, prend l'utilisateur connecté par défaut.
     * 
     * @param   string      $right
     * @param   boolean     $redirect
     * @param   int         $user
     * @return  boolean|void
     */
    public function can($right, $redirect = true, $user = null) {
        // Si l'utilisateur n'est pas définie on prend l'utilisateur actuel.
        if (is_null($user))
            $user = $this->_CI->session->userdata('USR_ID');
        
        // Si l'utilisateur a changé, on recharge les droits.
        if ($this->_user !== $user) {
            $this->_user = $user;
            $this->_loadRights();
        }

        // Si on check juste les droits.
        if (false === $redirect) {
            foreach ($this->_rights AS $rgt)
                if ($right === $rgt)
                    return true;
            return false;
        }

        // Si on redirige si on a pas les droits.
        else {
            $redirect = true;
            foreach ($this->_rights AS $rgt)
                if ($right === $rgt)
                    $redirect = false;
            
            if ($redirect)
                redirect('/accessDenied/', 'refresh');
        }
    }

    /**
     * Permet de définir le module pour lequel on check les droits.
     * @param type $module
     */
    public function setModule($module) {
        $this->_module = $module;
    }

    /* PRIVATE METHODS */

    /**
     * Charge les groupes de l'utilisateur actuel.
     */
    private function _getGroupsOfUser() {
        $this->_CI->db = $this->_CI->load->database('DB_PLASTPROD', true);
        $tmp = $this->_CI->db
                ->select('*')
                ->from('"S_INTRANET"."P_S_GROUP_USER_BY_USR_ID_00"(' . $this->_user . ')')
                ->get()
                ->result()
        ;

        $this->_groups = array();
        foreach ($tmp AS $group)
            array_push($this->_groups, $group->GRP_ID);
    }

    /**
     * Permet de récupérer les droits du module de l'utilisateur.
     */
    private function _getRightsOfModule() {
        $this->_CI->db = $this->_CI->load->database('DB_PLASTPROD', true);
        $tmp = $this->_CI->db
                ->select('"S_INTRANET"."V_RIGHT_GROUP_RTG"."RGT_RIGHT"')
                ->from('"S_INTRANET"."V_RIGHT_GROUP_RTG"')
                ->where('"MOD_NAME"', $this->_module)
                ->where_in('"GRP_ID"', $this->_groups)
                ->get()
                ->result()
        ;

        $this->_rights = array();
        foreach ($tmp AS $right)
            array_push($this->_rights, $right->RGT_RIGHT);
    }

    /**
     * recharge la class.
     */
    private function _loadRights() {
        $this->_getGroupsOfUser();
        $this->_getRightsOfModule();
    }

}